\documentclass[a4paper, 12pt]{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian,english]{babel}
\usepackage[pdftex,unicode]{hyperref}
\usepackage[pdftex]{graphicx}

\begin{document}
KOT!. Метакомпиляторы.

Я нашел еще один плюс от внутренней структуры KOT! - это возможность просто реализовать поддержку метапрограммирования.

Что такое метапрограммирование? Если не вдаваться в детали - хак, в котором, вместо того, что бы писать программу, мы пишем программу, которая её напишет. Например, у нас есть сложная (много классов) система, работу которой мы хотим понять.- для этого достаточно добавить в начало и конец каждого метода код, который пишет в лог сообщение вида: "В объекте x класса y вызван метод z 09:38:06". Это можно делать вручную, но лучше автоматизировать этот процесс. Здесь на помощь придут метакомпиляторы KOT!'а.

Метакомпилятором я назвал плагин, который изменяет DOM после того, как пользователь нажал кнопку build, но до непосредственной компиляции.

Кроме метапрограммирования, или как частный его случай, можно использовать метакомпиляторы для незначительного изменения C\#. То есть вместо\\
MessageBox.Show("Hello, world");\\
написать\\
message("Hello, world");\\
генератор DOM посчитает эту строчку вызовом метода этого же класса. Но в этом классе не будет этого метода. Затем соответствующий метакомпилятор пройдет DOM в поиске вызовов методов, которых нет. Отберет нужные (по сигнатуре) и заменет message на MessageBox.Show, получив на выходе правильный C\#.

Метакомпилятор должен предоставлять некоторую информацию о том, какие изменения он производит, что бы нельзя было подключить два метакомпилятора, которые реагируют на одну и ту же метку, например, на вызов несуществующего метода message. Эту информацию должны предоставлять только те метакомпиляторы, которые расширяют C\#. Поэтому можно выделить два типа метакомпиляторов: синтаксический (изменяет язык и предоставляет об этом информацию) и семантический (изменяет DOM из компилирующегося в компилирующейся, например, самый первый пример).

Возможно, синтаксические метакимпиляторы должны не только предоставлять информацию, но и расширять генератор DOM из кода - что бы иметь возможность подсвечивать ошибки.
\end{document}